"""
列表推导式

格式：
    [表达式 for 变量 in 列表]
    [表达式 for 变量 in 列表 if 条件]

列表推导式共有两种形式：
    1.[x for x in data if condition]
        此处if主要起条件判断作用，data数据中只有满足if条件的才会被留下，最后统一成为一个数据列表

    2.[exp1 if condition else exp2 for x in data]
        此处if...else主要起赋值作用，当data中的数据满足if条件时将其做exp1处理，否则按照exp2处理，最后统一生成为一个数据列表
"""

# 例1：过滤掉长度小于3的字符串列表，并将剩下的转成大写字母

names = ["Bob", "Tom", "alice", "Jerry", "Wendy", "Smith"]
result = [name.upper() for name in names if len(name) > 3]
print(result)

# 例2：生成间隔5分钟的时间列表序列

result = ["%02d:%02d" % (h, m) for h in range(0, 24) for m in range(0, 60, 5)]
print(result)

# 例3：求(x, y)其中x是0-5之间的偶数，y是0-5之间的奇数组成的元素列表

result = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
print(result)

# 例4：求M中3,6,9组成的列表

M = [[1,2,3],[4,5,6],[7,8,9]]
result = [row[2] for row in M]
print(result)

result = [M[row][2] for row in (0,1,2)]
print(result)

# 例5：求M中斜线1,5,9组成的列表

M = [[1,2,3],[4,5,6],[7,8,9]]
result = [M[i][i] for i, row in enumerate(M)]
print(result)

# 改成如下的方式更好
result = [M[i][i] for i in range(len(M))]
print(result)

# 例6：求M,N中矩阵和元素的乘积

M = [[1,2,3],[4,5,6],[7,8,9]]
N = [[2,2,2],[3,3,3],[4,4,4]]
result = [M[i][j] * N[i][j] for i in range(3) for j in range(3)]
print(result)
result = [[M[i][j] * N[i][j] for j in range(3)] for i in range(3)]
print(result)
result = [[M[i][j] * N[i][j] for i in range(3)] for j in range(3)]
print(result)

# 例7：将字典中age键，按照条件赋新值

bob = {'pay':3000, 'job':'dev', 'age':42, 'name':'Bob Smith'}
sue = {'pay':4000, 'job':'hdw', 'age':45, 'name':'Sue Jones'}
people = [bob, sue]
result = [rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people]
print(result)

# 例8：若我要取得以上列表中值大于2000的数值，这里可以使用列表推导式的形式1

data = ['driver', '2017-07-13', 1827.0, 2058.0, 978.0, 1636.0, 1863.0, 2537.0, 1061.0]
result = [x for x in data if type(x) == float and x > 2000]
print(result)

# 例9：得到30以内被3整除的数字列表

multiples = [i for i in range(30) if i % 3 is 0]
print(multiples)

# 例10：

multiples = [i * i for i in range(30) if i % 3 is 0]
print(multiples)

# 将推导式的[]改成()即可得到生成器

multiples = (i * i for i in range(30) if i % 3 is 0)
print(type(multiples))